package com.xbdun.web.validatebmp.utils.code;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.font.FontRenderContext;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;

import org.springframework.data.redis.core.StringRedisTemplate;

public abstract class VeriCodeUtil {
	private static final String VERICODE_CONST = "VERICODE";
	/**
	* 生成验证码
	* @Title: printCode
	* @Description	生成验证码
	* @param request	请求对象
	* @param response	
	* @param sessionCode
	* @param length		生成验证码的长度
	* @param width		宽度 70
	* @param height     高度 25
	* @return void    返回类型
	 */
	public static void printCode(StringRedisTemplate tmplet, HttpServletResponse response,String sessionCode,int length,int width,int height){
		ByteArrayOutputStream output = new ByteArrayOutputStream();  
        String code = outputCaptcha(output,length,width,height);
        tmplet.opsForValue().set(getVeriCodeKey(sessionCode,code),code);
        //设置验证码
        tmplet.expire(getVeriCodeKey(sessionCode,code),3,TimeUnit.MINUTES);//TimeUnit.MINUTES);
        try {  
        	ServletOutputStream out = response.getOutputStream();  
            output.writeTo(out);  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
	}
	
	/**
	* @Title: getVeriCodeKey
	* @Description 组合验证码的KEY
	* @param sessionCode
	* @param value
	* @return    设定文件
	* @return String    返回类型
	 */
	public final static String getVeriCodeKey(String sessionCode,String value){
		return (VERICODE_CONST+":"+sessionCode+":"+value);
	}
	/**
	 * 绘画验证码
	 * @param output
	 * @return
	 */
	private final static String outputCaptcha(ByteArrayOutputStream output,int length,int width,int height) {
		StringBuilder sbCode = new StringBuilder();
		// 随机产生4个字符
		for (int i = 0; i < length; i++) {
			sbCode.append(randomChar());
		}
		String code = sbCode.toString();
		/*int width = 70;
		int height = 25;*/
		sbCode.setLength(0);
		sbCode = null;
		BufferedImage bi = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
		Font font = new Font("Times New Roman", Font.PLAIN, 20);
		// 调用Graphics2D绘画验证码
		Graphics2D g = bi.createGraphics();
		g.setFont(font);
		Color color = new Color(66, 2, 82);
		g.setColor(color);
		g.setBackground(new Color(226, 226, 240));
		g.clearRect(0, 0, width, height);
		FontRenderContext context = g.getFontRenderContext();
		Rectangle2D bounds = font.getStringBounds(code, context);
		double x = (width - bounds.getWidth()) / 2;
		double y = (height - bounds.getHeight()) / 2;
		double ascent = bounds.getY();
		double baseY = y - ascent;
		g.drawString(code, (int) x, (int) baseY);
		g.dispose();
		try {
			ImageIO.write(bi, "jpg", output);
		} catch (IOException e) {
			e.printStackTrace();
		}
		return code;
	}

	/**
	 * 随机参数一个字符
	 * 
	 * @return
	 */
	private final static char randomChar() {
		Random r = new Random();
		String s = "ABCDEFGHJKLMNPRSTUVWXYZ0123456789";
		return s.charAt(r.nextInt(s.length()));
	}
}
